/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mundialfp.view.main;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import mundialfp.view.encuentro.RegistrarEncuentro;
import mundialfp.view.message.MessageService;
import mundialfp.view.pais.PaisABM;
import mundialfp.view.pais.RankingView;
import mundialfp.view.tables.bombos.TableBomboManager;
import mundialfp.view.tables.paisPuntos.PuntosTableModel;
import mundialfp.view.tables.paisPuntos.TablePuntosManager;
import mundialfp.view.ws.MundialWSService;
import uy.com.pzit.core.util.ImageUtil;
import uy.com.pzit.fpmundialmodel.web.ws.Bombo;
import uy.com.pzit.fpmundialmodel.web.ws.Eliminatoria;
import uy.com.pzit.fpmundialmodel.web.ws.Mundial;
import uy.com.pzit.fpmundialmodel.web.ws.MundialResponse;

/**
 *
 * @author pferraz
 */
public class PrincipalManager {

    private final Principal main;
    private final TablePuntosManager tGenerator;
    private final TableBomboManager tBomboGenerator;
    private Mundial mundialEnCurso;
    

    public PrincipalManager(Principal main) {
        this.tGenerator = new TablePuntosManager();
        this.tBomboGenerator= new TableBomboManager();
        this.main = main;
    }

    private void updateTable(String elimName) {

        if (elimName.equalsIgnoreCase("CONMEBOL")) {

            tGenerator.initTablePuntos(main.getTblTablaConmebol(), mundialEnCurso.getEliminatorias(), elimName, 0);
        } else if (elimName.equalsIgnoreCase("AFC")) {
            tGenerator.initTablePuntos(main.getTblTablaAFC(), mundialEnCurso.getEliminatorias(), elimName, 0);
        } else if (elimName.equalsIgnoreCase("CAF")) {
            tGenerator.initTablePuntos(main.getTblTablaCAF(), mundialEnCurso.getEliminatorias(), elimName, 0);
        } else if (elimName.equalsIgnoreCase("OFC")) {
            tGenerator.initTablePuntos(main.getTblTablaOFC(), mundialEnCurso.getEliminatorias(), elimName, 0);
        } else if (elimName.equalsIgnoreCase("CONCACAF")) {
            tGenerator.initTablePuntos(main.getTblTablaCONCACAF(), mundialEnCurso.getEliminatorias(), elimName, 0);
        } else if (elimName.equalsIgnoreCase("UEFA 1")) {
            tGenerator.initTablePuntos(main.getTblTablaUEFA1(), mundialEnCurso.getEliminatorias(), "UEFA", 1);
        } else if (elimName.equalsIgnoreCase("UEFA 2")) {
            tGenerator.initTablePuntos(main.getTblTablaUEFA2(), mundialEnCurso.getEliminatorias(), "UEFA", 2);
        } else if (elimName.equalsIgnoreCase("UEFA 3")) {
            tGenerator.initTablePuntos(main.getTblTablaUEFA3(), mundialEnCurso.getEliminatorias(), "UEFA", 3);
        } else if (elimName.equalsIgnoreCase("UEFA 4")) {
            tGenerator.initTablePuntos(main.getTblTablaUEFA4(), mundialEnCurso.getEliminatorias(), "UEFA", 4);
        }

    }

    private void clearTables() {
        main.getTblTablaAFC().setModel(new PuntosTableModel(0));
        main.getTblTablaCAF().setModel(new PuntosTableModel(0));
        main.getTblTablaCONCACAF().setModel(new PuntosTableModel(0));
        main.getTblTablaConmebol().setModel(new PuntosTableModel(0));
        main.getTblTablaOFC().setModel(new PuntosTableModel(0));
        main.getTblTablaUEFA1().setModel(new PuntosTableModel(0));
        main.getTblTablaUEFA2().setModel(new PuntosTableModel(0));
        main.getTblTablaUEFA3().setModel(new PuntosTableModel(0));
        main.getTblTablaUEFA4().setModel(new PuntosTableModel(0));

    }

    private void showMundialEnCurso(Mundial mundial) {
        mundialEnCurso = mundial;
        main.getPnlMundial().setVisible(true);
        main.getLblBanderaAnf().setVisible(true);
        showHeader(true);
        int IMG_WIDTH = 90;
        int IMG_HEIGHT = 50;
        BufferedImage originalImage = ImageUtil.decodeToImage(mundialEnCurso.getLocalidad().getBanderaB64());

        ImageIcon icon = new ImageIcon(ImageUtil.resizeImage(originalImage, IMG_WIDTH, IMG_HEIGHT));

        icon.getImage().getScaledInstance(34, 14, Image.SCALE_FAST);

        main.getLblBanderaAnf().setIcon(icon);
        main.getLblNombreAnfitrion().setText(mundialEnCurso.getLocalidad().getNombre());
        main.getLblNroMundial().setText(mundialEnCurso.getId() + "");
        main.getLblFechaInicio().setText(new SimpleDateFormat("dd-MM-yyyy").format(mundialEnCurso.getFechaInicio().toGregorianCalendar().getTime()));
        main.getLblFechaFin().setText("");
        main.getPnlMundial().setVisible(true);
        main.getPnlSorteo().setVisible(false);
        main.getPnlFaseGrupos().setVisible(false);
        main.getPnlOctavos().setVisible(false);
        main.getPnlCuartos().setVisible(false);
        main.getPnlSemi().setVisible(false);
        main.getPnlFinal().setVisible(false);
        clearTables();
        main.checkEliminatoriaComplete();
    }

    private void showTablesData() {
        tGenerator.initTablePuntos(main.getTblTablaAFC(), mundialEnCurso.getEliminatorias(), "AFC", 0);
        tGenerator.initTablePuntos(main.getTblTablaConmebol(), mundialEnCurso.getEliminatorias(), "CONMEBOL", 0);
        tGenerator.initTablePuntos(main.getTblTablaCAF(), mundialEnCurso.getEliminatorias(), "CAF", 0);
        tGenerator.initTablePuntos(main.getTblTablaOFC(), mundialEnCurso.getEliminatorias(), "OFC", 0);
        tGenerator.initTablePuntos(main.getTblTablaCONCACAF(), mundialEnCurso.getEliminatorias(), "CONCACAF", 0);
        tGenerator.initTablePuntos(main.getTblTablaUEFA1(), mundialEnCurso.getEliminatorias(), "UEFA", 1);
        tGenerator.initTablePuntos(main.getTblTablaUEFA2(), mundialEnCurso.getEliminatorias(), "UEFA", 2);
        tGenerator.initTablePuntos(main.getTblTablaUEFA3(), mundialEnCurso.getEliminatorias(), "UEFA", 3);
        tGenerator.initTablePuntos(main.getTblTablaUEFA4(), mundialEnCurso.getEliminatorias(), "UEFA", 4);
    }

    public void createTables() {
        /*INICIALIZO TABLA AFC*/
        tGenerator.createPointsTables(832, 77, main.getTblTablaAFC(), main.getPnlAfc());

        /*INICIALIZO TABLA CONMEBOL*/
        tGenerator.createPointsTables(832, 77, main.getTblTablaConmebol(), main.getPnlConmebol());

        /*INICIALIZO TABLA CONCACAF*/
        tGenerator.createPointsTables(832, 77, main.getTblTablaCONCACAF(), main.getPnlConcacaf());

        /*INICIALIZO TABLA CAF*/
        tGenerator.createPointsTables(832, 77, main.getTblTablaCAF(), main.getPnlCaf());

        /*INICIALIZO TABLA OFC*/
        tGenerator.createPointsTables(832, 77, main.getTblTablaOFC(), main.getPnlOfc());

        /*INICIALIZO TABLA UEFA 1*/
        tGenerator.createPointsTables(827, 60, main.getTblTablaUEFA1(), main.getPnlUefa1());

        /*INICIALIZO TABLA UEFA 2*/
        tGenerator.createPointsTables(827, 60, main.getTblTablaUEFA2(), main.getPnlUefa2());

        /*INICIALIZO TABLA UEFA 3*/
        tGenerator.createPointsTables(827, 60, main.getTblTablaUEFA3(), main.getPnlUefa3());

        /*INICIALIZO TABLA UEFA 4*/
        tGenerator.createPointsTables(827, 60, main.getTblTablaUEFA4(), main.getPnlUefa4());
        
         /*INICIALIZO Bombo 1*/
        tBomboGenerator.createBombosTables(827, 60, main.getTblBombo1(), main.getPnlSorteo());
        
        /*INICIALIZO Bombo 2*/
        tBomboGenerator.createBombosTables(827, 60, main.getTblBombo2(), main.getPnlSorteo());
        
        /*INICIALIZO Bombo 3*/
        tBomboGenerator.createBombosTables(827, 60, main.getTblBombo3(), main.getPnlSorteo());
        
        /*INICIALIZO Bombo 4*/
        tBomboGenerator.createBombosTables(827, 60, main.getTblBombo4(), main.getPnlSorteo());

    }

    public void cargando(boolean cargando,String message) {
        main.getLblBallLoad().setVisible(cargando);
        main.getLblLoad().setText(message);
        main.getLblLoad().setVisible(cargando);
    }

    public Eliminatoria getElim() {
        int tbElim = main.getTbpConfederaciones().getSelectedIndex();
        String elimName = main.getTabNames().get(tbElim);
        int subGrupo = 0;
        if (tbElim == 5) {
            elimName = main.getTabNames().get(tbElim);
            tbElim = main.getTbpUefa().getSelectedIndex();
            subGrupo = (tbElim + 1);
        }
        for (Eliminatoria e : mundialEnCurso.getEliminatorias()) {
            if (e.getConfederacion().getNombre().equalsIgnoreCase(elimName) && e.getSubGrupoConfederacion() == subGrupo) {
                return e;
            }
        }
        return null;
    }

   
    
    public void showHeader(boolean show) {
        main.getLblNroMundial().setVisible(show);
        main.getLblNroMundTitle().setVisible(show);
        main.getLblInicioMundTitle().setVisible(show);
        main.getLblFechaInicio().setVisible(show);
        main.getLblFinMundTitle().setVisible(show);
        main.getLblFechaFin().setVisible(show);
        main.getLblAnfitrionMundTitle().setVisible(show);
        main.getLblNombreAnfitrion().setVisible(show);

    }

    void runMundialEnCurso() {
        cargando(true,"CARGANDO");
        new NonBlockingOperationPrincipalManager("getMundialEnCurso").start();
    }

    public Mundial getMundialEnCurso() {
        return mundialEnCurso;
    }

    
    
    void getPaisABM() {
        cargando(true,"CARGANDO");
        new NonBlockingOperationPrincipalManager("getPaisABM").start();
    }

    void resgistrarEncuentro() {
        cargando(true,"CARGANDO");
        new NonBlockingOperationPrincipalManager("resgistrarEncuentro").start();
    }
    
    void getRankingFIFA() {
        new NonBlockingOperationPrincipalManager("getRankingFIFA").start();
    }

    public void iniciarEliminatoria() {
        int tbElim = main.getTbpConfederaciones().getSelectedIndex();
        String elimName = main.getTabNames().get(tbElim);
        int subGrupo = 0;
        if (tbElim == 5) {
            elimName = main.getTabNames().get(tbElim);
            tbElim = main.getTbpUefa().getSelectedIndex();
            elimName += " " + (tbElim + 1);
            subGrupo = (tbElim + 1);
        }
        if (JOptionPane.showConfirmDialog(null, "¿Desea iniciar la eliminatoria " + elimName + "?") == 0) {
            cargando(true,"GENERANDO");
            NonBlockingOperationPrincipalManager nonBlockManager = new NonBlockingOperationPrincipalManager("iniciarEliminatoria");
            nonBlockManager.setElimName(elimName);
            nonBlockManager.setSubGrupo(subGrupo);
            nonBlockManager.start();
        }
    }

    PrincipalManager getPManager(){
        return this;
    }
    
    public void newMundial() {
        cargando(true,"CREANDO");
        new NonBlockingOperationPrincipalManager("newMundial").start();
    }
    
    public void newMundialFifa15() {
        cargando(true,"CREANDO");
        new NonBlockingOperationPrincipalManager("newMundialFifa15").start();
    }

    public void refreshButtonVisibility() {
       main.checkEliminatoriaComplete();
    }

    public void getNextPhaseSorteo() {
        cargando(true,"GENERANDO");
        new NonBlockingOperationPrincipalManager("getNextPhaseSorteo").start();
    }

    void runMundialFifaXEnCurso() {
        cargando(true,"CARGANDO");
        new NonBlockingOperationPrincipalManager("getMundialFifaXEnCurso").start();
    }

    

    private class NonBlockingOperationPrincipalManager extends Thread {

        private final String methodName;
        private String elimName;
        private int subGrupo;

        public NonBlockingOperationPrincipalManager(String methodName) {
            this.methodName = methodName;
        }

        @Override
        public void run() {
            try {
                if (this.methodName.equalsIgnoreCase("getMundialEnCurso")) {
                    getMundialEnCurso();
                } else if (this.methodName.equalsIgnoreCase("getPaisABM")) {
                    getPaisABM();
                } else if (this.methodName.equalsIgnoreCase("getMundialFifaXEnCurso")) {
                    getMundialFifaXEnCurso();
                } else if (this.methodName.equalsIgnoreCase("newMundial")) {
                    newMundial();
                } else if (this.methodName.equalsIgnoreCase("iniciarEliminatoria")) {
                    iniciarEliminatoria();
                } else if (this.methodName.equalsIgnoreCase("resgistrarEncuentro")) {
                    resgistrarEncuentro();
                }else if (this.methodName.equalsIgnoreCase("getRankingFIFA")) {
                    getRankingFIFA();
                }else if (this.methodName.equalsIgnoreCase("getNextPhaseSorteo")) {
                    getNextPhaseSorteo();
                }else if (this.methodName.equalsIgnoreCase("newMundialFifa15")) {
                    newMundialFifa15();
                }
                this.interrupt();
            } catch (Throwable ex) {
                Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        private void getPaisABM() {
            new PaisABM().setVisible(true);
            cargando(false,"");
        }

        private void getRankingFIFA(){
            new RankingView().setVisible(true);
        }
        
        private void resgistrarEncuentro() {
            Eliminatoria elim=getElim();
            String name=(elim.getSubGrupoConfederacion()==0)?elim.getConfederacion().getNombre():elim.getConfederacion().getNombre()+elim.getSubGrupoConfederacion();
            new RegistrarEncuentro(mundialEnCurso.getEncuentros(), "ELIMINATORIA",elim,main.getMapElimTable().get(name),getPManager()).setVisible(true);
            cargando(false,"");
        }

        private void getMundialEnCurso() {
            MundialResponse resp = MundialWSService.getLastMundial();
            if (resp.isSuccess()) {
                showMundialEnCurso(resp.getMundial());
                showTablesData();
                cargando(false,"");
            } else {
                MessageService.infoBox(resp.getMessage(), "Info");
            }

        }
        
        private void getNextPhaseSorteo() {
            MundialResponse resp = MundialWSService.nextPhaseSorteo(mundialEnCurso);
            if (resp.isSuccess()) {
                /*LLENO TABLA DE BOMBOS*/
                for(Bombo b:resp.getMundial().getBombos())
                    tBomboGenerator.initTableBombo(main.getTblBombo1(), b);
                cargando(false,"");
            } else {
                MessageService.infoBox(resp.getMessage(), "Info");
            }

        }

        private void newMundial() {
            //Luego fijarse que no este uno en curso cuando voy a crear uno
            MundialResponse resp = MundialWSService.newMundial();
            if (resp.isSuccess()) {
                showMundialEnCurso(resp.getMundial());
            } else {
                MessageService.infoBox(resp.getMessage(), "Info");
            }            
            cargando(false,"");
        }
        
       private void newMundialFifa15() {
            //Luego fijarse que no este uno en curso cuando voy a crear uno
            MundialResponse resp = MundialWSService.newMundialFifaX();
            if (resp.isSuccess()) {
                showMundialFifaXEnCurso(resp.getMundial());
            } else {
                MessageService.infoBox(resp.getMessage(), "Info");
            }            
            cargando(false,"");
        }
        private void iniciarEliminatoria() {
            for (Eliminatoria e : mundialEnCurso.getEliminatorias()) {
                String elName = (elimName.contains("UEFA")) ? elimName.substring(0, elimName.length() - 2) : elimName;
                if (e.getConfederacion().getNombre().equalsIgnoreCase(elName)) {
                    if (e.getSubGrupoConfederacion() == subGrupo) {
                        try {
                            GregorianCalendar c = new GregorianCalendar();
                            c.setTime(new Date());
                            e.setFechaInicio(DatatypeFactory.newInstance().newXMLGregorianCalendar(c));
                            MundialWSService.updateMundial(mundialEnCurso);
                            updateTable(elimName);
                        } catch (DatatypeConfigurationException ex) {
                            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
            main.checkEliminatoriaComplete();
            cargando(false,"");
        }

        public void setElimName(String elimName) {
            this.elimName = elimName;
        }

        public void setSubGrupo(int subGrupo) {
            this.subGrupo = subGrupo;
        }

        private void showMundialFifaXEnCurso(Mundial mundial) {
            mundialEnCurso = mundial;
            main.getFrmMundialFifaX().setVisible(true);

        }

    private void showTablesData() {
        tGenerator.initTablePuntos(main.getTblTablaAFC(), mundialEnCurso.getEliminatorias(), "AFC", 0);
        tGenerator.initTablePuntos(main.getTblTablaConmebol(), mundialEnCurso.getEliminatorias(), "CONMEBOL", 0);
        tGenerator.initTablePuntos(main.getTblTablaCAF(), mundialEnCurso.getEliminatorias(), "CAF", 0);
        tGenerator.initTablePuntos(main.getTblTablaOFC(), mundialEnCurso.getEliminatorias(), "OFC", 0);
        tGenerator.initTablePuntos(main.getTblTablaCONCACAF(), mundialEnCurso.getEliminatorias(), "CONCACAF", 0);
        tGenerator.initTablePuntos(main.getTblTablaUEFA1(), mundialEnCurso.getEliminatorias(), "UEFA", 1);
        tGenerator.initTablePuntos(main.getTblTablaUEFA2(), mundialEnCurso.getEliminatorias(), "UEFA", 2);
        tGenerator.initTablePuntos(main.getTblTablaUEFA3(), mundialEnCurso.getEliminatorias(), "UEFA", 3);
        tGenerator.initTablePuntos(main.getTblTablaUEFA4(), mundialEnCurso.getEliminatorias(), "UEFA", 4);
        }

        private void getMundialFifaXEnCurso() {
            MundialResponse resp = MundialWSService.getLastMundialFifaX();
            if (resp.isSuccess()) {
                showMundialFifaXEnCurso(resp.getMundial());
               // showTablesData();
                cargando(false,"");
            } else {
                MessageService.infoBox(resp.getMessage(), "Info");
            }
        }

    }
}
